接下來的篇幅會開始寫關於 ES6
的部分,首先先從變數的宣告下手,在以往我們都是使用 var
來宣告變數
先來講 let
的部分,假設今天我們的程式碼如下:
console.log(mom);
var mom = '老媽';
(function () {
console.log(mom);
})();
這時候會依序輸出:undefined
老媽
但如果我們把 var
改成 let
,輸出就會錯誤,這是因為 var
宣告時,已經在記憶體佔了一個位置,只是我們還沒賦予值,所以第一次在 console
的時候才會顯示 undefined
而當第二行我們賦予值的時候才被輸出出來,但是 let
宣告的話,依序從上而下,還沒有發現宣告的變數賦予值,所以才會出現錯誤
第二種情況,是作用域的部分:
function varMing () {
var ming = '小明';
if (true) {
var ming = '杰哥';
}
console.log(ming);
}
varMing();
這時候在 console
輸出會出現杰哥,但是如果改成 let
宣告的話,輸出就會是小明,並不會被 if
的判斷式取代掉var
的作用域是 function scope
let
的作用域是 block
簡單來說 let
的作用域是 {}
大括號之間的部分
第三種情況是 for
迴圈的時候,宣告變數 i
的時候:
for (var i = 0; i < 10; i++) {
console.log(i);
setTimeout(function () {
console.log('這執行第' + i + '次');
}, 10);
}
在這樣的情況下,console
會直接輸出,這執行第 10 次
,並不是我們預期的,這執行第 1 次,這執行第 2 次,這執行第 3 次....
這是因為 i
已經被宣告為全域變數了,他會在迴圈內累加之後再輸出,我們在 console
內輸入 window.i
就會發現有數字輸出,如果改成 let
宣告 i
變數,就會發現結果如我們所預期,這是因為 let
的作用域是 block
是在 {}
之間,且在 console
輸入 window.i
就會是 undefined
接著我們來說明 const
:
const ming = '鐵錚錚男子漢';
當我們宣告一個變數使用 const
的時候,就不能去改動它的值,這會出現錯誤,如果這時候我們把 ming
改成其他的內容:
ming = '男子漢';
就會發現在 console
會跳錯,但是如果是更改物件的屬性呢:
const family = {
mom: '老媽',
me: '小明',
sister: '小橙'
};
family.father = '爸爸';
會發現是可以的,因為物件的屬性是傳參考特性就不影響,如果把宣告的物件改成空物件,這時候就會出錯了
2020/06/22 補充:
var 宣告的變數,往往都會是全域變數,進而會影響到開發,舉個例子:
在 for 迴圈的時候,或者 if 判斷式的時候
// for 迴圈
for(var i=0; i<10; i++){
console.log(i);
}
console.log(i);
// if 判斷式
if(true){
var feedBack = '同意';
}
console.log(feedBack);
在上述兩種情況,會發現在 for 迴圈外和 if 判斷式外,用 console 查看在內部宣告的變數,仍然可以看到,這是因為 var 宣告的變數為全域,為了讓變數可以在 {}
的作用域內,這時候就可以採用 let 來做宣告
假設沒有 let 的情況下,該如何解決既有的這個問題? 可以採取立即函式!
(function(){
for(var i=0; i<10; i++){
console.log(i);
}
}());
console.log(i);
這時候 console 就會跳錯,這也是為了限制作用域的部分 ~